package com.hk.utils;

import com.hk.enums.OuterErrorEnum;
import com.hk.exception.BizException;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;

import java.util.Collection;
import java.util.Objects;

/**
 * 断言工具类
 * @Author ：zanglk
 * @DateTime ：2022/11/9 00:47
 * @Description ：本工具最初目的是减少手写if判断，为了结合更好的业务操作，添加异常类，然后全局异常管理。
 * @Notes ：To change this template：Click IDEA-Preferences to search 'File Templates'
 */
public class AssertUtils {

    /**
     * 判断对象是非空，如果对象是空，就抛异常
     *
     * @param object       判断对象
     * @param errorMessage 异常提示信息
     */
    public static void notNull(@Nullable Object object, String errorMessage) {
        if (null != object) {
            throw new BizException(errorMessage);
        }
    }

    /**
     * 判读对象是不是空，如果是非空，就抛异常
     *
     * @param object       判断对象
     * @param errorMessage 异常提示信息
     */
    public static void isNull(@Nullable Object object, String errorMessage) {
        if (null != object) {
            throw new BizException(errorMessage);
        }
    }

    /**
     * 判断是否是真，如果对象是false，就抛出异常
     *
     * @param expression   判断对象
     * @param errorMessage 异常提示信息
     */
    public static void isTrue(boolean expression, String errorMessage) {
        if (!expression) {
            throw new BizException(errorMessage);
        }
    }

    /**
     * 判断是否是真，如果对象是false，就抛出异常。
     *
     * @param expression   判断对象
     * @param errorMessage 异常提示信息
     */
    public static void isTrue(Boolean expression, String errorMessage) {
        if (Boolean.FALSE.equals(expression)) {
            throw new BizException(errorMessage);
        }
    }

    /**
     * 判断集合是否有数据，如果没有数据，就抛出异常。
     *
     * @param collection   集合对象
     * @param errorMessage 错误提示信息
     */
    public static void notEmpty(@Nullable Collection<?> collection, String errorMessage) {
        if (CollectionUtils.isEmpty(collection)) {
            throw new BizException(errorMessage);
        }
    }

    /**
     * 判断集合是否有数据，如果没有数据，就抛出异常。 这里利用的是Spring自带的工具
     *
     * @param array        数组对象
     * @param errorMessage 错误提示信息
     */
    public static void notEmpty(@Nullable Object[] array, String errorMessage) {
        if (ObjectUtils.isEmpty(array)) {
            throw new BizException(errorMessage);
        }
    }

    /**
     * 判断字符串是否有效是真实的且非空格，如果无法满足，就抛出异常。 这里利用的是org.apache.commons.lang3的二次封装。
     *
     * @param word         数组对象
     * @param errorMessage 错误提示信息
     */
    public static void isNotBlank(String word, String errorMessage) {
        /**
         *   StringUtils.isBlank(null)      = true
         *   StringUtils.isBlank("")        = true
         *   StringUtils.isBlank(" ")       = true
         *   StringUtils.isBlank("bob")     = false
         *   StringUtils.isBlank("  bob  ") = false
         */
        if (StringUtils.isBlank(word)) {
            throw new BizException(errorMessage);
        }
    }
    /**
     * 判断字符串是否有效是真实的且非空格，如果无法满足，就抛出异常。 这里利用的是org.apache.commons.lang3的二次封装。
     *
     * @param word         数组对象
     * @param errorEnum 错误提示信息枚举
     */
    public static void isNotBlank(String word, OuterErrorEnum errorEnum) {
        /**
         *   StringUtils.isBlank(null)      = true
         *   StringUtils.isBlank("")        = true
         *   StringUtils.isBlank(" ")       = true
         *   StringUtils.isBlank("bob")     = false
         *   StringUtils.isBlank("  bob  ") = false
         */
        if (StringUtils.isBlank(word)) {
            OuterErrorEnum errorEnumByName = OuterErrorEnum.getErrorEnumByName(errorEnum.name());
            if (Objects.nonNull(errorEnumByName)) {
                throw new BizException(errorEnumByName.getCode(), errorEnumByName.getMsg());
            }
            throw new BizException(OuterErrorEnum.PARAM_ISNULL_ERROR.getCode(), OuterErrorEnum.PARAM_ISNULL_ERROR.getMsg());
        }
    }

}